package com.lancoo.edu.platform.operation.commons.utils.database;

import com.lancoo.edu.platform.operation.commons.utils.RunWindowsUtil;
import lombok.extern.slf4j.Slf4j;

import java.io.File;

/**
 * @author zhang.ws
 * @date 2024/1/29 11:14
 * @description mysql导出导入工具类
 */
@Slf4j
public class DmExportImportUtil {

    /**
     * 组装数据库备份导出命令
     *
     * @param dmDumpPath 达梦导出引擎地址
     * @param userName   数据库连接用户名
     * @param password   数据库连接密码
     * @param host       数据库IP
     * @param port       数据库端口
     * @param dbNames    数据库名称
     * @param outFile    导出文件名称
     * @param outLog     导出日志文件名称
     * @param directory  导出文件所在目录
     * @return 数据库备份导出命令
     */
    private static String getExportCommand(String dmDumpPath, String userName,
                                           String password, String host,
                                           String port, String dbNames,
                                           String outFile, String outLog, String directory) {
        return dmDumpPath + "dexp "
                + userName + "/" + password
                + "@" + host + ":" + port
                + " FILE=" + outFile + " LOG=" + outLog + " DIRECTORY=" + directory
                + " SCHEMAS=" + dbNames + "TABLESPACE=Y";
    }

    /**
     * 组装数据库备份导入命令
     *
     * @param dmDumpPath 达梦导入引擎地址
     * @param userName   数据库连接用户名
     * @param password   数据库连接密码
     * @param host       数据库IP
     * @param port       数据库端口
     * @param dbNames    数据库名称
     * @param inFile     导入文件名称
     * @param inLog      导入日志文件名称
     * @param directory  导入文件所在目录
     * @return 数据库备份导出命令
     */
    private static String getImportCommand(String dmDumpPath, String userName,
                                           String password, String host,
                                           String port, String dbNames,
                                           String inFile, String inLog, String directory) {
        return dmDumpPath + "dimp "
                + userName + "/" + password
                + "@" + host + ":" + port
                + " FILE=" + inFile + " LOG=" + inLog + " DIRECTORY=" + directory
                + " SCHEMAS=" + dbNames + "TABLE_EXISTS_ACTION=REPLACE";
    }

    /**
     * 导出
     *
     * @param dmDumpPath  dm的Dump命令地址
     * @param userName    登录dm数据库用户名
     * @param password    登录dm数据库密码
     * @param host        dm数据库IP
     * @param port        dm数据库端口
     * @param dbName      要导出的数据库
     * @param fileDir     要导出数据文件所在目录
     * @param fileDmpName 导出文件名称
     * @param fileLogName 导出日志名称
     * @return 是否成功 true/false
     */
    public static String exportSql(String dmDumpPath, String userName, String password, String host, String port, String dbName, String fileDir, String fileDmpName, String fileLogName) {
        String command = getExportCommand(dmDumpPath, userName, password, host, port, dbName, fileDmpName, fileLogName, fileDir);
        log.info("【数据库备份命令：{}】", command);
        log.info("【数据库导出文件地址：{}{}】", fileDir, fileDmpName);
        File dir = new File(fileDir);
        if (!dir.exists()) {
            if (!dir.mkdirs()) {
                throw new RuntimeException("文件夹创建失败");
            }
        }
        return fileDir + fileDmpName;
    }

    /**
     * 导入
     *
     * @param dmDumpPath  dm的Dump命令地址
     * @param userName    登录dm数据库用户名
     * @param password    登录dm数据库密码
     * @param host        dm数据库IP
     * @param port        dm数据库端口
     * @param dbName      要导入的数据库
     * @param inFile      导入文件名称
     * @param fileDir     导入文件地址
     * @param fileLogName 导入的日志名称
     * @return 是否成功 true/false
     */
    public static boolean importSql(String dmDumpPath, String userName, String password, String host, String port, String dbName, String inFile, String fileDir, String fileLogName) {
        String command = getImportCommand(dmDumpPath, userName, password, host, port, dbName, inFile, fileLogName, fileDir);
        log.info("【数据库导入命令：{}】", command);
        log.info("【数据库导入地址文件：{}{}】", fileDir, inFile);
        // 从文件中读取输入内容
        return RunWindowsUtil.run(command);
    }
}
